package com.buli.blmall.admin.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;

/**
 * @author xiang.gao
 * @date 2025/2/28 15:15
 */
@Slf4j
public class JwtUtil {

    /**
     * token过期时间,4个小时
     */
    public static final long EXPIRE = 1000 * 60 * 60 * 4;

    /**
     * 密钥
     */
    public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO15";

    /**
     * 秘钥Key
     */
    private static final SecretKey secretKey = Keys.hmacShaKeyFor(APP_SECRET.getBytes(StandardCharsets.UTF_8));

    /**
     * 生成token字符串的方法
     * @param token
     * @return
     */
    public static String createToken(String token){
        return Jwts.builder()
                .header().add("typ", "JWT").add("alg", "HS256").and()
                .subject("user")
                .issuedAt(new Date())
                .expiration(new Date(System.currentTimeMillis() + EXPIRE))
                //设置token主体部分 ，存储用户信息
                .claim("token", token)
                .signWith(secretKey)
                .compact();
    }

    /**
     * 验证token字符串是否是有效的  包括验证是否过期
     * @param jwtToken
     * @return
     */
    public static boolean checkToken(String jwtToken) {
        if(jwtToken == null || jwtToken.isEmpty()){
            log.error("Jwt is empty");
            return false;
        }
        try {
            Claims claims = Jwts.parser()
                    .verifyWith(secretKey)
                    .build()
                    .parseSignedClaims(jwtToken)
                    .getPayload();
            // 检查 Token 是否过期（更准确的逻辑）
            return claims.getExpiration().after(new Date());
        } catch (Exception e) {
            log.error(e.getMessage());
            return false;
        }
    }

    /**
     * 获取token主体部分
     * @param jwtToken
     * @return
     */
    public static Claims getTokenBody(String jwtToken){
        if(jwtToken == null || jwtToken.isEmpty()){
            log.error("Jwt is empty");
            return null;
        }
        try {
            return Jwts.parser()
                    .verifyWith(secretKey)
                    .build()
                    .parseSignedClaims(jwtToken)
                    .getPayload();
        } catch (Exception e){
            log.error(e.getMessage());
            return null;
        }
    }


}
